﻿namespace Operation.FlowChart
{
    ///// <summary>
    ///// 流程图操作数据类,用来记录对流程图进行的操作
    ///// </summary>
    //public class FCOperation
    //{

    //    public enum FCOperationType
    //    {
    //        Non,

    //        AddNode,
    //        RemoveNode,
    //        UpdateNode,
    //        SortNode,

    //        AddLine,
    //        RemoveLine,
    //        UpdateLine,
    //        SortLine,



    //    }

    //    public FCOperationType Type;
    //    public long TimeMS;

    //    public FCNode Node_Old,Node_New;
    //    public FCLine Line_Old,Line_New;

    //    public bool BValue;

    //    private FCOperation(FCOperationType Type)
    //    {
    //        this.Type = Type;
    //    }

    //    static public FCOperation CreatAddNodeOp(FCNode newnode) {
    //        return new FCOperation(FCOperationType.AddNode) { Node_New = newnode };
    //    }
    //    static public FCOperation CreatRemoveNodeOp(FCNode oldnode)
    //    {
    //        return new FCOperation(FCOperationType.RemoveNode) { Node_Old=oldnode};
    //    }
    //    static public FCOperation CreatUpdateNodeOp(FCNode oldnode, FCNode newnode)
    //    {
    //        return new FCOperation(FCOperationType.AddNode) { Node_Old = oldnode, Node_New = newnode };
    //    }
    //    static public FCOperation CreatSortNodeOp()
    //    {
    //        throw new NotImplementedException();
    //    }

    //    static public FCOperation CreatAddLineOp(FCLine newline)
    //    {
    //        return new FCOperation( FCOperationType.AddLine) { Line_New = newline };
    //    }
    //    static public FCOperation CreatRemoveLineOp(FCLine oldeline)
    //    {
    //        return new FCOperation(FCOperationType.RemoveLine) { Line_Old = oldeline};
    //    }
    //    static public FCOperation CreatUpdateLineOp(FCLine oldeline, FCLine newline)
    //    {
    //        return new FCOperation(FCOperationType.RemoveLine) { Line_Old = oldeline, Line_New = newline };
    //    }
    //    static public FCOperation CreatSortLineOp()
    //    {
    //        throw new NotImplementedException();
    //    }
    //    //todo

    //}

    ///// <summary>
    ///// 流程图操作管理器,用来管理所有流程图操作
    ///// </summary>
    //public class FCOperationManager
    //{

    //    private int DoingPtr;
    //    private List<FCOperation> Operations;
    //    private FCDoc Doc;

    //    public bool CanUnDo => DoingPtr > 0;
    //    public bool CanReDo => DoingPtr < Operations.Count - 1;

    //    public FCOperationManager()
    //    {

    //    }
    //    public FCOperationManager(BinaryReader br)
    //    {
    //        throw new NotImplementedException();
    //    }

    //    #region 基础操作
    //    public void UnDo()
    //    {
    //        if (!CanUnDo)
    //            throw new Exception("Cant UnDo");
    //        FCOperation op = Operations[DoingPtr - 1];
    //        switch (op.Type)
    //        {
    //            case FCOperation.FCOperationType.Non:
    //                throw new Exception();
    //            case FCOperation.FCOperationType.AddNode:
    //                Doc.RemoveNode(op.Node_New.Id);
    //                break;
    //            case FCOperation.FCOperationType.RemoveNode:
    //                Doc.AddNode(op.Node_Old);
    //                break;
    //            case FCOperation.FCOperationType.UpdateNode:
    //                Doc.UpdateNode(op.Node_Old);
    //                break;
    //            case FCOperation.FCOperationType.SortNode:
    //                throw new Exception();
    //                break;
    //            case FCOperation.FCOperationType.AddLine:
    //                Doc.RemoveLine(op.Node_New.Id);
    //                break;
    //            case FCOperation.FCOperationType.RemoveLine:
    //                Doc.AddLine(op.Line_Old);
    //                break;
    //            case FCOperation.FCOperationType.UpdateLine:
    //                Doc.UpdateLine(op.Line_Old);
    //                break;
    //            case FCOperation.FCOperationType.SortLine:
    //                throw new Exception();
    //                break;
    //            default:
    //                break;
    //        }
    //        throw new NotImplementedException();
    //    }
    //    public void ReDo()
    //    {
    //        if (!CanReDo)
    //            throw new Exception("Cant ReDo");
    //        FCOperation op = Operations[DoingPtr ];
    //        switch (op.Type)
    //        {
    //            case FCOperation.FCOperationType.Non:
    //                throw new Exception();
    //                break;
    //            case FCOperation.FCOperationType.AddNode:
    //                Doc.AddNode(op.Node_New);
    //                break;
    //            case FCOperation.FCOperationType.RemoveNode:
    //                Doc.RemoveNode(op.Node_Old.Id);
    //                break;
    //            case FCOperation.FCOperationType.UpdateNode:
    //                Doc.UpdateNode(op.Node_New);
    //                break;
    //            case FCOperation.FCOperationType.SortNode:
    //                Doc.NodeIdSort(op.BValue);
    //                break;
    //            case FCOperation.FCOperationType.AddLine:
    //                Doc.AddLine(op.Line_New);
    //                break;
    //            case FCOperation.FCOperationType.RemoveLine:
    //                Doc.RemoveLine(op.Line_Old.Id);
    //                break;
    //            case FCOperation.FCOperationType.UpdateLine:
    //                Doc.UpdateLine(op.Line_New);
    //                break;
    //            case FCOperation.FCOperationType.SortLine:
    //                Doc.LineIdSort();
    //                break;
    //            default:
    //                break;
    //        }
    //    }
    //    public void Record(FCOperation op)
    //    {
    //        if (DoingPtr < Operations.Count - 1) {
    //            Operations[DoingPtr] = op;
    //            //移除之后的所有操作 用于保证在撤销操作后重新记录操作的重做不会产生错误
    //            Operations.RemoveRange(DoingPtr+1, Operations.Count-DoingPtr-1);
    //        }   
    //        else
    //            Operations.Add(op);
    //        DoingPtr++;
    //    }
    //    public void ToBytes()
    //    {
    //        throw new NotImplementedException();
    //    }
    //    #endregion


    //    #region 重现操作
    //    public void StartReShow() { }
    //    public void StopReShow() { }
    //    public void ChangeFrame() { }
    //    public void ChangeSpeed(int speedrate) { }
    //    #endregion



    //}
}

